package com.vst.pushlib;


import java.util.List;
import org.json.JSONException;
import org.json.JSONObject;
import android.content.Context;
import android.content.Intent;
import android.text.TextUtils;
import android.util.Log;
import com.baidu.frontia.api.FrontiaPushMessageReceiver;

/**
 * Push消息处理receiver。请编写您需要的回调函数， 一般来说： onBind是必须的，用来处理startWork返回值；
 * onMessage用来接收透传消息； onSetTags、onDelTags、onListTags是tag相关操作的回调；
 * onNotificationClicked在通知被点击时回调； onUnbind是stopWork接口的返回值回调
 * 
 * 返回值中的errorCode，解释如下： 0 - Success 10001 - Network Problem 30600 - Internal
 * Server Error 30601 - Method Not Allowed 30602 - Request Params Not Valid
 * 30603 - Authentication Failed 30604 - Quota Use Up Payment Required 30605 -
 * Data Required Not Found 30606 - Request Time Expires Timeout 30607 - Channel
 * Token Timeout 30608 - Bind Relation Not Found 30609 - Bind Number Too Many
 * 
 * 当您遇到以上返回错误时，如果解释不了您的问题，请用同一请求的返回值requestId和errorCode联系我们追查问题。
 * 
 */

public class PushMessageReceiver extends FrontiaPushMessageReceiver {
    /** TAG to Log */
    public static final String TAG = PushMessageReceiver.class.getSimpleName();

    private String pkgName = null;
    List<String> mTags = null;

    /**
     * 调用PushManager.startWork后，sdk将对push
     * server发起绑定请求，这个过程是异步的。绑定请求的结果通过onBind返回。 如果您需要用单播推送，需要把这里获取的channel
     * id和user id上传到应用server中，再调用server接口用channel id和user id给单个手机或者用户推送。
     * 
     * @param context
     *            BroadcastReceiver的执行Context
     * @param errorCode
     *            绑定接口返回值，0 - 成功
     * @param appid
     *            应用id。errorCode非0时为null
     * @param userId
     *            应用user id。errorCode非0时为null
     * @param channelId
     *            应用channel id。errorCode非0时为null
     * @param requestId
     *            向服务端发起的请求id。在追查问题时有用；
     * @return none
     */
    @Override
    public void onBind(Context context, int errorCode, String appid, String userId, String channelId, String requestId) {
        String responseString = "onBind errorCode=" + errorCode + " appid=" + appid + " userId=" + userId
                + " channelId=" + channelId + " requestId=" + requestId;
        Log.d(TAG, responseString);

        pkgName = getPackageName(appid);

        // 绑定成功，设置已绑定flag，可以有效的减少不必要的绑定请求
        if (errorCode == 0) {
            PushConstant.setBind(context, true);
        }
        // Log.d(TAG, "save tdcode userId");
        PushConstant.getSp(context).edit().putString(PushConstant.EXTRA_API_ID, appid)
                .putString(PushConstant.EXTRA_CHANNEL_ID, channelId).putString(PushConstant.EXTRA_USER_ID, userId)
                .commit();

        // Log.d(TAG, "send tdcode userId by broadcast");
        Intent intent = new Intent(PushConstant.ACTION_TDCODE_BY_PUSH).putExtra(PushConstant.EXTRA_API_ID, appid)
                .putExtra(PushConstant.EXTRA_CHANNEL_ID, channelId).putExtra(PushConstant.EXTRA_USER_ID, userId)
                .putExtra(PushConstant.PUSH_PKG, pkgName);
        context.sendBroadcast(intent);

        // Log.d(TAG, "get bind key form server");
        PushHandler.bind(context, appid, channelId, userId, pkgName);
    }

    /**
     * 接收透传消息的函数。
     * 
     * @param context
     *            上下文
     * @param message
     *            推送的消息
     * @param customContentString
     *            自定义内容,为空或者json字符串
     */
    @Override
    public void onMessage(Context context, String message, String customContentString) {
        String messageString = " message=\"" + message + "\" customContentString=" + customContentString;
        Log.d(TAG, messageString);
        // Log.d(TAG, "pkg=" + pkgName);
        try {
            JSONObject json = new JSONObject(message);
            Intent intent = null;
            String mTag = null;
            String type = null;
            if (json.has("compage")) {
                pkgName = json.getString("compage");
                Log.d(TAG, "server pkg=" + pkgName);
            }
            if (json.has("type")) {
                type = json.getString("type");
                if ("apkdown".equals(type)) {
                    intent = new Intent(PushConstant.ACTION_DOWNLOADAPK_PUSH).putExtra(PushConstant.EXTRA_MESSAGE,
                            message);

                } else if ("liveplay".equals(type)) {
                    intent = new Intent(PushConstant.ACTION_LIVEPLAY_BY_PUSH).putExtra(PushConstant.EXTRA_MESSAGE,
                            message);
                } else if ("videoplay".equals(type)) {
                    intent = new Intent(PushConstant.ACTION_VIDEOPLAY_BY_PUSH).putExtra(PushConstant.EXTRA_MESSAGE,
                            message);
                } else if ("login".equals(type)) {
                    intent = new Intent(PushConstant.ACTION_LOGIN_BY_PUSH)
                            .putExtra(PushConstant.EXTRA_MESSAGE, message);
                } else if ("popupscreen".equals(type)) {
                    mTag = json.getString("tag");
                    intent = new Intent(PopupScreen.POPSCREEN_ACTION).putExtra(PushConstant.EXTRA_MESSAGE, message);

                } else if ("chatbin".equals(type)) {
                    String id = json.getString("fromUser");
                    PushConstant.setWeixinId(context, id);
                    intent = new Intent(PopupScreen.POPSCREEN_WEIXIN_ACTION).putExtra(PushConstant.EXTRA_MESSAGE, id);
                }

            } else {
                intent = new Intent(PushConstant.getControlAction());
                if (json.has("state")) {
                    intent.putExtra(PushConstant.EXTRA_STATE, json.getInt("state"));
                } else if (json.has("url")) {
                    intent.setAction(PushConstant.getAction());
                    intent.putExtra(PushConstant.EXTRA_KEY, PushConstant.getBindKey());
                    intent.putExtra(PushConstant.EXTRA_URL, json.getString("url"));
                    if (json.has("title")) {
                        intent.putExtra(PushConstant.EXTRA_TITLE, json.getString("title"));
                    }
                    if (json.has("ptype")) {
                        intent.putExtra(PushConstant.EXTRA_LIVE, "live".equals(json.getString("ptype")));
                    }
                    if (json.has("vid")) {
                        intent.putExtra(PushConstant.EXTRA_VID, json.getString("vid"));
                    }

                } else if (json.has("pos")) {
                    intent.putExtra(PushConstant.EXTRA_POS, json.getInt("pos"));
                } else if (json.has("volume")) {
                    intent.putExtra(PushConstant.EXTRA_VOLUME, json.getInt("volume"));
                    intent.putExtra(PushConstant.EXTRA_MUTE, json.getBoolean("mute"));
                } else if (json.has("key")) {
                    Log.d(TAG, "save bind key on sp");
                    PushConstant.setBindKey(json.getString("key"));
                    PushConstant.getSp(context).edit().putString(PushConstant.EXTRA_KEY, PushConstant.getBindKey())
                            .commit();
                    Log.d(TAG, "send bind key by broadcast");
                    intent = new Intent(PushConstant.ACTION_BINDKEY_BY_PUSH).putExtra(PushConstant.EXTRA_KEY,
                            PushConstant.getBindKey());
                }
            }
            intent.putExtra(PushConstant.PUSH_PKG, pkgName);
            // if(type!=null&&type.equals("popupscreen")){
            //
            // // if(mTags!=null&&mTags.contains(mTag)){
            // context.sendBroadcast(intent);
            // }
            // }
            // else{
            // context.sendBroadcast(intent);
            // }
            context.sendBroadcast(intent);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 接收通知点击的函数。注：推送通知被用户点击前，应用无法通过接口获取通知的内容。
     * 
     * @param context
     *            上下文
     * @param title
     *            推送的通知的标题
     * @param description
     *            推送的通知的描述
     * @param customContentString
     *            自定义内容，为空或者json字符串
     */
    @Override
    public void onNotificationClicked(Context context, String title, String description, String customContentString) {
        String notifyString = "通知点击 title=\"" + title + "\" description=\"" + description + "\" customContent="
                + customContentString;
        // Log.d(TAG, notifyString);

        // 自定义内容获取方式，mykey和myvalue对应通知推送时自定义内容中设置的键和值
        if (customContentString != null & TextUtils.isEmpty(customContentString)) {
            JSONObject customJson = null;
            try {
                customJson = new JSONObject(customContentString);
                String myvalue = null;
                if (customJson.isNull("mykey")) {
                    myvalue = customJson.getString("mykey");
                }
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }

    /**
     * setTags() 的回调函数。
     * 
     * @param context
     *            上下文
     * @param errorCode
     *            错误码。0表示某些tag已经设置成功；非0表示所有tag的设置均失败。
     * @param successTags
     *            设置成功的tag
     * @param failTags
     *            设置失败的tag
     * @param requestId
     *            分配给对云推送的请求的id
     */
    @Override
    public void onSetTags(Context context, int errorCode, List<String> sucessTags, List<String> failTags,
            String requestId) {
        String responseString = "onSetTags errorCode=" + errorCode + " sucessTags=" + sucessTags + " failTags="
                + failTags + " requestId=" + requestId;
        mTags = sucessTags;
        // Log.d(TAG, responseString);

    }

    /**
     * delTags() 的回调函数。
     * 
     * @param context
     *            上下文
     * @param errorCode
     *            错误码。0表示某些tag已经删除成功；非0表示所有tag均删除失败。
     * @param successTags
     *            成功删除的tag
     * @param failTags
     *            删除失败的tag
     * @param requestId
     *            分配给对云推送的请求的id
     */
    @Override
    public void onDelTags(Context context, int errorCode, List<String> sucessTags, List<String> failTags,
            String requestId) {
        String responseString = "onDelTags errorCode=" + errorCode + " sucessTags=" + sucessTags + " failTags="
                + failTags + " requestId=" + requestId;
        // Log.d(TAG, responseString);

    }

    /**
     * listTags() 的回调函数。
     * 
     * @param context
     *            上下文
     * @param errorCode
     *            错误码。0表示列举tag成功；非0表示失败。
     * @param tags
     *            当前应用设置的所有tag。
     * @param requestId
     *            分配给对云推送的请求的id
     */
    @Override
    public void onListTags(Context context, int errorCode, List<String> tags, String requestId) {
        String responseString = "onListTags errorCode=" + errorCode + " tags=" + tags;
        // Log.d(TAG, responseString);

    }

    /**
     * PushManager.stopWork() 的回调函数。
     * 
     * @param context
     *            上下文
     * @param errorCode
     *            错误码。0表示从云推送解绑定成功；非0表示失败。
     * @param requestId
     *            分配给对云推送的请求的id
     */
    @Override
    public void onUnbind(Context context, int errorCode, String requestId) {
        String responseString = "onUnbind errorCode=" + errorCode + " requestId = " + requestId;
        Log.d(TAG, responseString);

        // 解绑定成功，设置未绑定flag，
        if (errorCode == 0) {
            PushConstant.setBind(context, false);
        }
    }

    // 得到包名
    public String getPackageName(String appid) {
        String pkg = "";
        if (appid == null) {
            return pkg;
        }
        if (appid.equals("2481076")) {
            pkg = "net.myvst.v2";
        } else if (appid.equals("2458843")) {
            pkg = "com.vst.itv52.v1";
        } else if (appid.equals("2514521")) {
            pkg = "com.aili.juhe";
        } else if (appid.equals("2491767")) {
            pkg = "com.geniatech.iptv";
        } else if (appid.equals("2491774")) {
            pkg = "com.vst.live";
        }
        return pkg;
    }

}
